import socket
import threading
import re
import os
import time

"模块化文件，通过多线程，发送指令，远程服务器会从相应的网站下载指定文件"

# 处理serverip.txt文件，获取服务器列表
def get_server_lists():
    ip_lists = []
    rfiles = open('serverip.txt','r')
    rs = rfiles.readlines()
    for s in rs:
        s1 = s.replace('\n','')
        if not s1.startswith('#'):
            ip_lists.append(s1)
    return ip_lists

# 建立socket会话
def tcp_socket_client(tcpsocket, ip, port, url, savepath):

    try:
        tcpsocket.connect((ip,port))

        # 输入需要执行的选择，发送给服务端
        tcpsocket.send('1'.encode('utf-8'))

        # 接收服务器返回的消息
        rec_data = tcpsocket.recv(1024)

        #发送url和保存路径到服务端
        tcpsocket.send(url.encode('utf-8'))
        tcpsocket.send(savepath.encode('utf-8'))

        #接收服务端返回的状态
        rec_data1 = tcpsocket.recv(1024)
        print('%s:%s'%(ip,rec_data1.decode('gbk')))
        tcpsocket.close()

    except:
        print('%s:连接失败'%ip)

# 主函数
def main():
    print(r'输入url的路径，例如：http://x.x.x.x/base.zip')
    url = input()

    print(r'输入下载文件保存路径，例如D:\\tdx\\')
    savepath = input()

    th_lists = []  #空列表，所有的线程放在列表中

    for s in get_server_lists():
        ip = re.split(':',s)[0]  # 得到服务器的ip
        port = int(re.split(':',s)[1])  # 得到服务器的端口

        tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        # 调用功能函数one,多线程
        th = threading.Thread(target=tcp_socket_client,args=(tcp_socket,ip,port,url,savepath))
        th_lists.append(th)

    for t in th_lists:
        t.start()
        time.sleep(0.5)

    for t in th_lists:
        t.join()
